// ==============================
// 功能：
// 1. 从 input.txt 文件读取内容，用 "；" 分割
// 2. 每条内容复制到剪贴板
// 3. 打开抖音，等待并点击 “查看详情”
// 4. 点击完成 → 等 5s → 回到桌面 → 等 5s → 执行下一条
// 5. 全部执行完毕后退出
// ==============================

"ui";
let prepare_pay_task = require("./prepare_pay_task.js");
let payment_task = require("./payment_task.js");
let system = require("./modules/system.js");
let utils = require("./modules/utils");
let config = require("./modules/config");

system.SetKeepScreenOn()
let running = false;
let taskThread = null;
let permissionThread = null;
let RobotThread = null;
// ======= UI界面 =======
ui.layout(
    <vertical padding="16">
        <text text="抖音自动化脚本" textSize="20sp" gravity="center"/>
        <button id="btn_start_mainTask" text="开始运行主任务"/>
        <button id="btn_start_prepare_pay_task" text="开始运行预订单任务"/>
        <button id="btn_start_payment_task" text="开始运行付款任务"/>
        <button id="btn_stop" text="停止运行"/>
    </vertical>
);

// 读取输入文件
function readInputFile(filePath) {
    var content = files.read(filePath);
    if (!content) {
        system.Log("未找到文件: " + filePath, false);
        return [];
    }

    // 按 ; 分割每条任务
    var rawItems = content.split(";").map(s => s.trim()).filter(s => s.length > 0);
    var result = [];

    rawItems.forEach(item => {
        var parts = item.split("---");
        if (parts.length < 2) {
            system.Log("任务格式错误: " + item, false);
            return;
        }

        var text = parts[0].trim();
        var task_id = parts[1].trim();

        result.push({
            product_share_text: text,
            task_id: task_id
        });
    });

    system.Log("共读取到 " + result.length + " 条任务", false);
    return result;
}

// 读取输入文件
function readInputPaymentFile(filePath) {
    var content = files.read(filePath);
    if (!content) {
        system.Log("未找到文件: " + filePath, false);
        return [];
    }

    // 按 ; 分割每条任务
    var rawItems = content.split(";").map(s => s.trim()).filter(s => s.length > 0);
    var result = [];

    rawItems.forEach(item => {
        var parts = item.split("---");
        if (parts.length < 2) {
            system.Log("任务格式错误: " + item, false);
            return;
        }

        var text = parts[0].trim();
        var task_id = parts[1].trim();

        result.push({
            order_num: text,
            task_id: task_id
        });
    });

    system.Log("共读取到 " + result.length + " 条任务", false);
    return result;
}

// 判断是否在时间段内
function isInTimeRange() {
    let now = new Date();
    let hour = now.getHours();
    let minute = now.getMinutes();

    // 起始时间转分钟
    let start = config.startHour * 60;
    let end = config.endHour * 60;
    let current = hour * 60 + minute;

    return current >= start && current < end;
}

// 每秒检测自动点击权限允许，或者其他一些弹窗点掉
function checkPermission() {
    if (permissionThread && permissionThread.isAlive()) {
        return
    }
    // system.Log("开始检测权限");
    permissionThread = threads.start(function () {
        while (true) {
            // 匹配有‘允许、放弃’等字。主页，是模糊匹配。也就是含有就可以;textMatches(/.*(允许|放弃|不再提醒|START NOW).*/).clickable(true)代表只匹配可以点击的，也就是不会匹配纯文本.
            // 有个误区；用.find()时，没找到控件其实不是返回空。也就是if()是进不去的。通过size()才能知道找到了几个
            var fq_crl = text('残​忍​放​弃​').find()
            var allowBtns = []
            if (fq_crl.size()) {
                allowBtns = fq_crl
            } else {
                allowBtns = textMatches(/.*(允许|放弃|不再提醒|以后再说|立即开始|知道了|不感兴趣|START NOW).*/).find();
            }
            for (var i = 0; i < allowBtns.length; i++) {
                var allowBtn = allowBtns[i];
                if (allowBtn) {
                    // system.Log("找到控件，已自动点击权限允许");
                    sleep(300);
                    click(allowBtn.centerX(), allowBtn.centerY())
                }
            }
            sleep(500);
        }
    });
}

// 检测是否被识别出是机器人。如果是需要发信息停止
function checkRobot() {
    if (RobotThread && RobotThread.isAlive()) {
        return
    }
    RobotThread = threads.start(function () {
        while (true) {
            // var allowBtns = textMatches(/.*(操作过于频繁|访问被拒绝|开始检测|拖拽到这里).*/).findOne(1000);
            var allowBtns = textMatches(/.*开始检测.*|.*拖拽到这里.*|.*完成下列验证.*|身份验证/).findOne(1000);
            if (allowBtns) {
                app.launchApp("AutoJs6");
                system.Log("检测到封控，暂停脚本");
                utils.httpRequest(config.updateDyAccountStatus() + `?dy_account=${config.dy_account}&status=0`, {
                    method: "GET"
                });
                utils.httpRequest(config.qw_notice(), {
                    method: "GET"
                });
                sleep(300);
                app.launchApp(config.targetAppName);
                // utils.goBackground()
                stopTask()
            }
            sleep(1000);
        }
    });
}


// 主任务(包括预订单和付款任务)
function mainTask() {
    if (running) {
        system.Log("脚本已经在运行");
        return;
    }
    if (taskThread) {
        taskThread.interrupt();
    }
    checkPermission()
    checkRobot()

    taskThread = threads.start(function () {
        // // 启动通知;请求放主线程会报错，所以子线程里发
        utils.httpRequest(config.updateDyAccountStatus() + `?dy_account=${config.dy_account}&status=1`, {
            method: "GET"
        });
        var task_limit = 5
        var switch_times_threshold = config.switch_times_threshold
        running = true;
        let task_type = config.GetOrderTaskUrl() // config.GetOrderTaskUrl or  config.GetPayTaskUrl
        let isPrepare = false

        let one_true = true

        while (running) {
            try {
                // 判断是否在运行时间期间
                if (config.timeCheck && !isInTimeRange()) {
                    system.Log("不在运行时间段，跳过");
                    continue;
                }

                // 发送请求获取订单任务
                task_type = isPrepare ? config.GetOrderTaskUrl() : config.GetPayTaskUrl();
                if (isPrepare) {
                    system.Log("开始预订单任务");
                    task_limit = config.prepare_pay_task_limit
                } else {
                    task_limit = config.payment_task_limit
                    system.Log("开始付款任务");
                }
                var rsp = utils.httpRequest(task_type + `&limit=${task_limit}&clear_cache=${one_true}`, {
                    // var rsp = utils.httpRequest(task_type + `&limit=${task_limit}`, {
                    method: "GET"
                });
                // one_true = false
                if (!rsp || rsp.data.length === 0) {
                    system.Log(`请求失败或是没有任务:`);
                    system.Log(rsp);
                    continue;
                }

                if (task_type === config.GetOrderTaskUrl()) {
                    prepare_pay_task.prepare_pay_task(rsp.data)

                } else if (task_type === config.GetPayTaskUrl()) {
                    switch_times_threshold = 1
                    payment_task.payment_task(rsp.data)
                }


            } catch (e) {
                // 出错时执行
                system.Log("主任务出错，捕获到异常: " + e);

            } finally {
                switch_times_threshold -= 1
                if (switch_times_threshold <= 0) {
                    isPrepare = !isPrepare;
                    switch_times_threshold = config.switch_times_threshold
                }
                // 不管是正常、continue 还是报错，都会等 2 分钟
                system.Log("等待 20s");
                try {
                    sleep(20000); // 阻塞操作
                } catch (e) {
                    system.Log("sleep 被中断，清理中断状态");
                    java.lang.Thread.interrupted(); // 再次清理
                }
                // sleep(1000 * 60 * 1.5);
            }
        }

    })
}

// 开始预订单任务
function start_prepare_pay_task() {
    if (running) {
        return;
    }
    if (taskThread) {
        taskThread.interrupt();
    }
    checkPermission()
    // checkRobot()
    running = true;
    var items = readInputFile("modules/input.txt")
    taskThread = threads.start(() => {
        prepare_pay_task.prepare_pay_task(items)
    })
}

// 开始付款任务
function start_payment_task() {
    if (running) {
        return;
    }
    if (taskThread) {
        taskThread.interrupt();
    }
    checkPermission()
    // checkRobot()
    running = true;
    var items = readInputPaymentFile("modules/input_dd.txt")
    taskThread = threads.start(() => {
        payment_task.payment_task(items)
    })
}

// 停止任务
function stopTask() {
    if (!running) {
        system.Log("脚本未运行");
        return;
    }
    running = false;
    if (taskThread && taskThread.isAlive()) {
        taskThread.interrupt();
    }
    if (permissionThread && permissionThread.isAlive()) {
        permissionThread.interrupt();
    }
    if (RobotThread && RobotThread.isAlive()) {
        RobotThread.interrupt();
    }
    system.Log("脚本已停止", false);
}


// ======= 按钮绑定 =======
ui.btn_start_mainTask.on("click", mainTask);
ui.btn_start_prepare_pay_task.on("click", start_prepare_pay_task);
ui.btn_start_payment_task.on("click", start_payment_task);
ui.btn_stop.on("click", stopTask);
